.PHONY:clean

# https://www.cnblogs.com/paul-617/p/15501875.html

CC = gcc
CFLAGS = -g
C_SRCS=$(wildcard *.c)
C_OBJS=$(C_SRCS:.c=.o)

CPP = g++
RM = rm
EXE = cppDemo
INCLUDES = -I./3rd
CPPFLAGS = -g -std=c++11 

#wildcard 是通配符函数，通过它可以得到我们所需的⽂件，这个函数类似我们在 Windows 或Linux 命令⾏中的“*”。其形式是：$(wildcard pattern)
SRCS=$(wildcard *.cpp)


#patsubst 函数是⽤来进⾏字符串替换的，其形式是：$(patsubst pattern, replacement, text)
#OBJS = $(patsubst %.c, %.o, $(SRC))

OBJS=$(SRCS:.cpp=.o)

all:$(EXE)
# 当没有指明具体的⽬标是什么 时，那么 make 以 Makefile ⽂件中定义的第⼀个⽬标作为这次运⾏的⽬标
# 在命令前加上一个@，这个符号就是告诉make，在运行的时候这一行命令不显示出来。
#@echo "targt all"
#$@⽤于表示⼀个规则中的⽬标。当我们的⼀个规则中有多个⽬标时，$@所指的是其中任何造成命令被运⾏的⽬标。
#$^则表示的是规则中的所有先择条件。
#$<表示的是规则中的第⼀个先决条件。
#@echo "\$$@ = $@"
#@echo "\$$^ = $^"
#@echo "\$$< = $<"
#@echo "$(SRCS)"
	@echo "$(OBJS)"

$(EXE):$(OBJS) $(C_OBJS)
#@echo "target link"
	$(CPP) $(CPPFLAGS) -o $@ $^

%.o:%.c
#@echo "c code compile"
#@echo "\$$@ = $@"
#@echo "\$$^ = $^"
#@echo "\$$< = $<"
	$(CC) $(CFLAGS) -c $< -o $@

%.o:%.cpp %.h
# 采⽤了模式以后，不论有多少个源⽂件要编译，我们都是应⽤同⼀个模式规则的
# filter 函数⽤于从⼀个字符串中，根据模式得到满⾜模式的字符串，其形式是：$(filter pattern..., text)
#@echo "c++ code compile"
#@echo "\$$@ = $@"
#@echo "\$$^ = $^"
#@echo "\$$< = $<"
	$(CPP) $(CPPFLAGS) $(INCLUDES) -c $< -o $@

clean:
	rm $(EXE) $(OBJS) $(C_OBJS)
